home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
texte
/
7up_pd
/
vafunc.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-10-29
|
10KB
|
328 lines
/********************************************************************/
/* Funktionsprototypen für Funktionen, die die Kommunikation mit
GEMINI bzw. Venus vereinfachen
(c) 1990,91,92 by Stephan Gerle
E-Mail: Maus Net: Stephan Gerle @ DO
Internet: sg@do.maus.de
Stand: 8.3.92
Sämtliche Funktionen liefern 1, wenn die Hauptapplikation die
Funktion kennt bzw. 0, wenn die Hauptapplikation die Funktion
nicht kennt.
Die Funktionen wurden komplett umgeschrieben, da es erhebliche
Probleme mit dem Timeout gab.
Da das AV-Protokoll Event-orientiert arbeitet, ist die Realisierung
einiger Funktionen als Funktion nicht möglich bzw. führt nur
zu Problemen.
Siehe auch VAPROTO.H.
Achtung: 5er Tabs
*/
#ifndef __VAFUNC_H
#define __VAFUNC_H
#include <sg\vaproto.h>
/*** Macros **********************************************************/
/* AVSTR2MSG setzt den Wert eines String-Pointers in ein Message-
array ein.
msg : Name des Integerarrays.
offset : Kleinerer Index des Interger-Pärchens
str : Zeiger auf String
*/
#define AVSTR2MSG(msg,offset,str) (*(char **)(msg+offset) = str)
/* AVMSG2STR bastelt aus einem Integer-Pärchens einer Messages einen
String-Pointer zusammen.
msg : Name des Integerarrays
offset : Kleinerer Index des Integer-Pärchens.
*/
#define AVMSG2STR(msg,offset) ((char *)(((long)msg[offset]<<16)|(((long)msg[offset+1])&0xffff)))
/* AVHasProto() dient zum Test, ob die Hauptapplikation eine bestimmte
Funktion des AV-Protokolls unterstützt.
Als Parameter wird die Nummer des Words (0-2) sowie die Bitnummer
im Word übergeben.
Näheres hierzu siehe VAPROTO.H bei VA_PROTOSTATUS */
#define AVHasProto(word,bit) (AVStatus[word]&(1<<bit))
/* Liefert TRUE, wenn eine MultiTasking fähiges AES installiert ist.
*/
#define MultiAES() (_GemParBlk.global[1]!=1)
#define AP_TERM 50
/*** Globale Variablen für die Library für das AV-Protokoll **********/
/* AVName ist ein Pointer auf einen String, in dem der Name der
Hauptapplikation steht, die das AV-Protokoll beherrscht.
Diese Variable wird durch AVActive gesetzt. Der String ist ein
Leerstring, wenn das Hauptprogramm das AV-Protokoll nicht versteht.*/
extern char AVName[];
/* AVStatus[3] enthält den Protokollstatus der Hauptapplikation.
Mittels AVHasProto(word,bit) kann damit jede einzelne Funktion des
AV-Protokolls überprüft werden. */
extern int AVStatus[3];
/*** Funktionen für die Protokollunterstützung ***********************/
/* AVInit muß einmal beim Start des Acc's aufgerufen werden. Damit
wird die Applikationsid, der Name des Acc (wie bei appl_find benutzt;
also 8 des Programmnamens eventuell mit Leerzeichen aufgefüllt) sowie
die vom Acc unterstützten Funktionen als Bitvektor den Funktionen
für das AV-Protokoll übergeben.
Diese Routine sollte direkt vor Eintritt in die Messageloop
aufgerufen werden. */
void AVInit(int myapid,char *myname,int myprotostatus);
/* Ermittelt, ob Gemini oder Venus bzw. irgendein Hauptprogramm,
welches das AV-Protokoll versteht, aktiv ist.
Wenn nein, so wird 0 zurückgeliefert, sonst ein Wert ungleich 0.
Falls der Protokollstatus noch nicht ermittelt werden konnte, so
wird eine entsprechende Message an das Hauptprogramm geschickt.
Das Ergebnis ist dann ersteinmal 0. */
int AVActive(void);
/* Sorgt dafür, das der AV-Protokoll-Status neu ermittelt wird. Diese
Funktion wird bei einem AC_CLOSE durch AVProcessMsg() automatisch
aufgerufen. */
void AVGetNewProtoStatus(void);
/* Sendet Statusinformationen an die Hauptapplikation. */
int AVSendStatus(char *status);
/* Fragt bei der Hauptapplikation den für das Acc gespeicherten Status
nach.
Als Antwort kommt von der Hauptapplikation die Meldung VA_SETSTATUS.
Ansonsten muß die Meldung VA_SETSTATUS in der Messageloop behandelt
werden. In msg[3/4] ist ein Pointer auf einen String, der den
Status enthält. */
void AVReceiveStatus(void);
/* AVProcessMsg muss für jede empfangene Message aufgerufen werden.
AVProcessMsg liefert einen Wert ungleich 0, falls sich der
Protokollstatus geändert hat. Das heißt aber nicht, das die
Nachricht VA_PROTOSTATUS gekommen ist!!! */
int AVProcessMsg(int *msg);
/*** Programmspezifische Funktionen *********************************/
/* Emittelt den für Verzeichnisfenster eingestellten Font und die
Fonthöhe.
Die Hauptapplikation schickt daraufhin die Message VA_FILEFONT. */
int AVAskFileFont(void);
/* Dasselbe wie AVAskFileFont, nur für das Console-Fenster.
Als Ergebnis kommt die Message VA_CONFONT. */
int AVAskConsoleFont(void);
/* Fragt bei der Hauptapplikation nach den selektierten Objekten.
Als Antwort kommt die Message VA_OBJECT. Die Objekte sind jeweils
durch ein ' ' im String voneinander getrennt. */
void AVAskSelectedObjects(void);
/* Sagt Gemini, daß das Console-Fenster geöffnet werden soll. */
int AVOpenConsole(void);
/* Sagt der Hauptapplikation, das ein Fenster mit dem Verzeichnis
pfad und der Maske mask geöffnet werden soll. */
int AVOpenWindow(char *pfad,char *mask);
/* Startet mittels Venus bzw. Gemini ein Programm. In pfad steht
der komplette Pfad und der Programmname. cmdline enthält
die Kommandozeile für das zu startende Programm. */
int AVStartProgram(char *pfad,char *cmdline);
/* Sagt der Hauptapplikation, daß das Accessorie ein Fenster geöffnet hat.
*/
int AVAccOpenedWindow(int winhandle);
/* Sagt der Hauptapplikation, daß das Accessorie ein Fenster geschlossen
hat.
(ist nur bei nicht durch AC_CLOSE bedingtem Schließen notwendig) */
int AVAccClosedWindow(int winhandle);
/* Schickt der Hauptapplikation einen Tastaturevent. Ist dann anzuwenden,
wenn ein ACC ein Fenster offen hat, und einen Tastendruck bekommt,
den es selber nicht verwendet. */
int AVSendKeyEvent(int state,int key);
/* AVCopyDragged schickt die Message AV_COPY_DRAGGED an die
Hauptapplikation.
Die Hauptapplikation sollte daraufhin die vorher in das Fenster des
Accs gedraggten Icons in den Zielpfad kopieren.
kstate ist der Tastaturstatus wie von evnt_multi() erhalten.
Von der Hauptapplikation kommt als Antwort VA_COPY_COMPLETE. Nachdem
diese Mitteilung empfangen wurde, kann ein eventuell für das Kopieren
allozierter Speicher wieder freigegeben werden.
Diese Funktion darf nur als Antwort auf VA_DRAGACCWIND benutzt werden,
da sonst nicht eindeutig ist, was kopiert werden soll. */
int AVCopyDragged(int kstate,char *dest);
/*** Zur Anwendung ***************************************************/
#ifdef __DO_NOT_DEFINE
/* Hier ein minimales Skelett für die Verwendung der AV-Funktionen. */
void HandleMessage(int kstate,int *msg)
{
int FontId,FontPointsHeight;
char *status;
if (AVProcessMsg(msg))
{
/* Protokollstatus hat sich geändert */
if ("Habe offene Fenster")
for ("für jedes offene Fenster")
AVAccOpenedWindow(winhandle);
AVAskFileFont();
AVReceiveStatus();
...
}
switch (msg[0])
{
case WM_FULLED: ...
case WM_SIZED: ...
case WM_MOVED: ...
case WM_REDRAW: ...
case WM_TOPPED: ...
case WM_ARROWED: ...
case WM_VSLID: ...
case WM_HSLID: ...
case VA_SETSTATUS:
/* msg[3] und msg[4] enthalten Pointer auf
String mit Status (kann auch NULL sein) */
...
break;
case VA_FILEFONT:
/* msg[3] und msg[4] enthalten die Fontdaten
(siehe VAPROTO.H) */
...
break:
case VA_START:
/* msg[3] und msg[4] enthalten Pointer auf
Kommandozeile */
...
break;
case VA_DRAGACCWIND:
/* msg[6] und msg[7] enthalten Pointer auf
String mit Liste der auf das Fenster gezogenen
Objekte. */
...
break;
case VA_COPY_COMPLETE:
/* Kopiervorgang beendet. Eventuelle allozierter
Speicher wieder freigeben. */
break;
...
}
}
void HandleKey(int ks,int kb)
{
switch (kb)
{
...
default: AVSendKeyEvent(ks,kb);
break;
}
}
void EventLoop(void)
{
int event,msg[8],kb,ks;
do
{
event = evnt_multi(MU_MESAG|MU_KEYBD...,...,msg,...,ks,kb,...);
if (event&MU_MESAG)
HandleMessage(ks,msg);
if (event&MU_KEYBD)
HandleKey(ks,kb);
...
} while (!QuitFlg);
}
/* Die AV-Protokollfunktionen müssen durch den Aufruf von AVInit()
initialisiert werden.
Dieser Aufruf muß vor Benutzung aller anderen AV-Funktionen
gemacht werden. */
int gl_apid;
void main(void)
{
if ((gl_apid = appl_init())>=0)
{
...
AVInit(gl_apid,"ACCNAME ",1|2);
if (MultiAES())
"Warte, bis Status kommt oder Benutzer was will";
else
{
"Tue eventuell selber was (Fenster öffnen o.ä.)"
EventLoop();
}
...
appl_exit();
}
}
#endif
#endif